/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package aicue1.singletons;

import aicue1.beans.Item;
import aicue1.soapfaults.ItemUnavailableFault;
import aicue1.soapfaults.UnknownItemFault;
import java.util.ArrayList;
import java.util.ListIterator;

/**
 *
 * @author Thomas
 */
public class AvailableItemsSingleton
{
    /**
     * Privates Klassenattribut,
     * wird beim erstmaligen Gebrauch (nicht beim Laden) der Klasse erzeugt
     */
    private static AvailableItemsSingleton availableItemsInstance = null;

    private ArrayList<Item> availableItemsList = null;

    /** Konstruktor ist privat, Klasse darf nicht von außen instanziiert werden. */
    private AvailableItemsSingleton()
    {
        availableItemsList = new ArrayList<Item>();
    }

    /**
     * Statische Methode "getInstance()" liefert die einzige Instanz der Klasse zurück.
     * Ist synchronisiert und somit thread-sicher.
     */
    public synchronized static AvailableItemsSingleton getInstance()
    {
        if (availableItemsInstance == null)
        {
           availableItemsInstance = new AvailableItemsSingleton();
        }
        return availableItemsInstance;
    }

    public synchronized Boolean insertItem(Item item)
    {
        Boolean insertOk = false;
        if(!availableItemsList.contains(item))
        {
            availableItemsList.add(item);
            insertOk = true;
        }
        return insertOk;
    }
    
    public synchronized Boolean isAvailable(Item item) throws UnknownItemFault{
        if(availableItemsList.contains(item))
        {
            Item stock= 
                    availableItemsList.get(availableItemsList.indexOf(item));
            
            if(item.getQuantity() <= stock.getQuantity())
                return true;
        }else{
            throw new UnknownItemFault("Item is unknown");
        }
        return false;
    }

    public synchronized Boolean takeItems(Item[] items) throws UnknownItemFault,ItemUnavailableFault{
        for(int i=0;i < items.length;i++)
        {
            if(!isAvailable(items[i]))
                throw new ItemUnavailableFault("At least one item of the order is unavialable");
        }

         for(int i=0;i < items.length;i++)
        {
            int oldStock= availableItemsList.get(availableItemsList.indexOf(items[i])).getQuantity();
            availableItemsList.get(availableItemsList.indexOf(items[i])).setQuantity(oldStock-items[i].getQuantity());
        }

        return true;
    }

    public synchronized void clearList()
    {
        availableItemsList.clear();
    }
}
